/**
 * Copyright (c) 2006-2015, JGraph Ltd
 * Copyright (c) 2006-2015, Gaudenz Alder
 */
mxCodecRegistry.register(function()
{
    /**
     * Class: mxRootChangeCodec
     *
     * Codec for <mxRootChange>s. This class is created and registered
     * dynamically at load time and used implicitely via <mxCodec> and
     * the <mxCodecRegistry>.
     *
     * Transient Fields:
     *
     * - model
     * - previous
     * - root
     */
    var codec = new mxObjectCodec(new mxRootChange(),
        ['model', 'previous', 'root']);

    /**
     * Function: onEncode
     *
     * Encodes the child recursively.
     */
    codec.afterEncode = function(enc, obj, node)
    {
        enc.encodeCell(obj.root, node);

        return node;
    };

    /**
     * Function: beforeDecode
     *
     * Decodes the optional children as cells
     * using the respective decoder.
     */
    codec.beforeDecode = function(dec, node, obj)
    {
        if (node.firstChild != null &&
            node.firstChild.nodeType == mxConstants.NODETYPE_ELEMENT)
        {
            // Makes sure the original node isn't modified
            node = node.cloneNode(true);

            var tmp = node.firstChild;
            obj.root = dec.decodeCell(tmp, false);

            var tmp2 = tmp.nextSibling;
            tmp.parentNode.removeChild(tmp);
            tmp = tmp2;

            while (tmp != null)
            {
                tmp2 = tmp.nextSibling;
                dec.decodeCell(tmp);
                tmp.parentNode.removeChild(tmp);
                tmp = tmp2;
            }
        }

        return node;
    };

    /**
     * Function: afterDecode
     *
     * Restores the state by assigning the previous value.
     */
    codec.afterDecode = function(dec, node, obj)
    {
        obj.previous = obj.root;

        return obj;
    };

    // Returns the codec into the registry
    return codec;

}());
